Data Source

Source: US Environmental Protection Agency EJSCREEN Tool, 2020 data (last modified 7/1/21)

EJSCREEN is an “environmental justice (EJ) mapping and screening tool” produced by the EPA.

Variable Descriptions

glimpse(ejscreen)
## Rows: 46
## Columns: 38
## $ ID         <chr> "510010901001", "510010901002", "510010901003", "5100109010…
## $ statefips  <dbl> 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,…
## $ countyfips <chr> "001", "001", "001", "001", "001", "001", "001", "001", "00…
## $ tractfips  <chr> "090100", "090100", "090100", "090100", "090200", "090200",…
## $ blkgpfips  <dbl> 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3,…
## $ PRE1960PCT <dbl> 0.34929993, 0.45737855, 0.27187865, 0.17369309, 0.19648094,…
## $ DSLPM      <dbl> 0.1902349, 0.1902349, 0.1902349, 0.1902349, 0.1788288, 0.17…
## $ CANCER     <dbl> 19.86096, 19.86096, 19.86096, 19.86096, 21.57291, 21.57291,…
## $ RESP       <dbl> 0.2342597, 0.2342597, 0.2342597, 0.2342597, 0.2624767, 0.26…
## $ PTRAF      <dbl> NA, NA, NA, NA, 143.5144430, 4.9361403, 44.3148087, NA, 74.…
## $ PWDIS      <dbl> NA, NA, NA, NA, 1.163455e-04, 9.159836e-03, 2.248991e-03, 1…
## $ PNPL       <dbl> 0.01407226, 0.01383525, 0.01368040, 0.01347213, 0.01390480,…
## $ PRMP       <dbl> 0.06025332, 0.06554190, 0.06277244, 0.06913822, 0.66536960,…
## $ PTSDF      <dbl> 0.09912080, 0.11897784, 0.11237121, 0.13666498, 0.66536960,…
## $ OZONE      <dbl> 44.12727, 44.12727, 44.12727, 44.12727, 43.34960, 43.34960,…
## $ PM25       <dbl> 6.863168, 6.863168, 6.863168, 6.863168, 7.010748, 7.010748,…
## $ P_LDPNT    <dbl> 66.94467, 74.53987, 60.35342, 49.67612, 52.47047, 36.74985,…
## $ P_DSLPM    <dbl> 17.49458, 17.49458, 17.49458, 17.49458, 15.48154, 15.48154,…
## $ P_CANCR    <dbl> 6.943091, 6.943091, 6.943091, 6.943091, 11.166566, 11.16656…
## $ P_RESP     <dbl> 5.709885, 5.709885, 5.709885, 5.709885, 9.840690, 9.840690,…
## $ P_PTRAF    <dbl> NA, NA, NA, NA, 41.997946, 8.993928, 23.495505, NA, 30.5144…
## $ P_PWDIS    <dbl> NA, NA, NA, NA, 54.53093, 79.14500, 70.94844, 54.04574, 67.…
## $ P_PNPL     <dbl> 10.246804, 9.891942, 9.654256, 9.305683, 9.997929, 10.95281…
## $ P_PRMP     <dbl> 6.697439, 7.834296, 7.200346, 8.613989, 66.828961, 29.13652…
## $ P_PTSDF    <dbl> 13.633698, 16.354078, 15.479741, 18.672355, 42.786562, 37.9…
## $ P_OZONE    <dbl> 63.30248, 63.30248, 63.30248, 63.30248, 54.95983, 54.95983,…
## $ P_PM25     <dbl> 12.16725, 12.16725, 12.16725, 12.16725, 13.61657, 13.61657,…
## $ T_LDPNT    <chr> "0.35 = fraction pre-1960 (66%ile)", "0.46 = fraction pre-1…
## $ T_DSLPM    <chr> "0.19 ug/m3 (17%ile)", "0.19 ug/m3 (17%ile)", "0.19 ug/m3 (…
## $ T_CANCR    <chr> "20 lifetime risk per million (6%ile)", "20 lifetime risk p…
## $ T_RESP     <chr> "0.23  (5%ile)", "0.23  (5%ile)", "0.23  (5%ile)", "0.23  (…
## $ T_PTRAF    <chr> NA, NA, NA, NA, "140 daily vehicles/meters distance (41%ile…
## $ T_PWDIS    <chr> NA, NA, NA, NA, "0.00012 toxicity-weighted concentration/me…
## $ T_PNPL     <chr> "0.014 sites/km distance (10%ile)", "0.014 sites/km distanc…
## $ T_PRMP     <chr> "0.06 facilities/km distance (6%ile)", "0.066 facilities/km…
## $ T_PTSDF    <chr> "0.099 facilities/km distance (13%ile)", "0.12 facilities/k…
## $ T_OZONE    <chr> "44.1 ppb (63%ile)", "44.1 ppb (63%ile)", "44.1 ppb (63%ile…
## $ T_PM25     <chr> "6.86 ug/m3 (12%ile)", "6.86 ug/m3 (12%ile)", "6.86 ug/m3 (…

Observations are block group estimates of key environmental indicators:

  • Lead paint (PRE1960PCT)
  • Particulate matter levels in the air (DSLPM and PM25)
  • Air toxics cancer risk (CANCER)
  • Air toxics respiratory hazard index (RESP)
  • Traffic proximity (PTRAF)
  • Proximity to National Priorities List sites (PNPL)
  • Proximity to Risk Management Plan facilities (PRMP)
  • Proximity to Treatment Storage and Disposal facilities (PTSDF)
  • Ozone level in the air (OZONE)
  • Major direct dischargers to water (PWDIS)

P_ indicates percentile ranks for each variable, and T_ indicates map popup text.

Summary Statistics

ejscreen %>% select(-c(ID:blkgpfips, T_LDPNT:T_PM25)) %>%
  select(where(~is.numeric(.x) && !is.na(.x))) %>%
  as.data.frame() %>%
  stargazer(., type = "text", title = "Summary Statistics", digits = 1,
            summary.stat = c("mean", "sd", "min", "median", "max"))
## 
## Summary Statistics
## ==========================================
## Statistic  Mean St. Dev.  Min  Median Max 
## ------------------------------------------
## PRE1960PCT 0.3    0.2     0.0   0.3   0.7 
## DSLPM      0.2    0.01    0.2   0.2   0.2 
## CANCER     21.2   0.7    19.9   21.2  22.2
## RESP       0.3    0.01    0.2   0.3   0.3 
## PNPL       0.01   0.01    0.0   0.01  0.03
## PRMP       0.2    0.2     0.0   0.1   0.8 
## PTSDF      0.2    0.2     0.0   0.1   0.9 
## OZONE      44.6   0.6    43.3   44.9  45.5
## PM25       6.9    0.1     6.8   6.9   7.0 
## P_LDPNT    58.2   20.0   11.1   60.6  86.3
## P_DSLPM    14.2   1.6    11.5   14.2  17.5
## P_CANCR    10.1   1.7     6.9   10.2  12.8
## P_RESP     9.1    1.7     5.7   9.2   11.9
## P_PNPL     9.9    5.9    0.004  8.8   26.4
## P_PRMP     27.4   20.9   0.004  21.7  71.8
## P_PTSDF    16.3   12.5   0.004  13.3  47.7
## P_OZONE    67.5   5.2    55.0   70.2  73.8
## P_PM25     12.6   0.6    11.7   12.8  13.6
## ------------------------------------------

Visual Descriptions

Distributions

ejscreen %>% select(ID, PRE1960PCT:PM25) %>% 
  pivot_longer(-ID, names_to = "measure", values_to = "value") %>% 
  ggplot(aes(x = value, fill = measure)) + 
  scale_fill_viridis(option = "plasma", discrete = TRUE, guide = FALSE) +
  geom_histogram() + 
  facet_wrap(~measure, scales = "free")

meta %>% 
  filter(varname %in% c("PRE1960PCT", "DSLPM", "CANCER", "RESP", "PTRAF", "PWDIS", "PNPL", "PRMP", "PTSDF", "OZONE", "PM25")) %>% 
  mutate(label = paste0(varname, ": ", about)) %>% 
  select(label) %>% 
  as.list()
## $label
##  [1] "PRE1960PCT: % of housing built before 1960 -- lead paint indicator"                                             
##  [2] "DSLPM: Diesel particulate matter level in the air, measured in micrograms per cubic meter"                      
##  [3] "CANCER: Cancer risk due to toxics in the air"                                                                   
##  [4] "RESP: \"Ratio of exposure concentration to health-based reference concentration\""                              
##  [5] "PTRAF: Average number of daily vehicles at major roads divided by distance in meters"                           
##  [6] "PWDIS: Toxicity-weighted stream concentrations divided by distance in kilometers"                               
##  [7] "PNPL: Number of National Priorities List (NPL) sites within 5 km divided by distance in kilometers"             
##  [8] "PRMP: Number of Risk Management Plan (RMP) facilities within 5 km divided by distance in kilometers"            
##  [9] "PTSDF: Number of Treatment Storage and Disposal (TSDF) facilities within 5 km divided by distance in kilometers"
## [10] "OZONE: Summer daily average of ozone concentration in the air, in parts per billion"                            
## [11] "PM25: Yearly average PM2.5 level in the air, measured in micrograms per cubic meter"

Correlation Matrices

The following figure shows the correlations among primary measures. The darker the color, the more highly correlated a pair of variables are.

ejscreen %>% select(PRE1960PCT:PM25) %>% 
  ggcorr(label = TRUE, label_alpha = TRUE)

meta %>% 
  filter(varname %in% c("PRE1960PCT", "DSLPM", "CANCER", "RESP", "PTRAF", "PWDIS", "PNPL", "PRMP", "PTSDF", "OZONE", "PM25")) %>% 
  mutate(label = paste0(varname, ": ", about)) %>% 
  select(label) %>% 
  as.list()
## $label
##  [1] "PRE1960PCT: % of housing built before 1960 -- lead paint indicator"                                             
##  [2] "DSLPM: Diesel particulate matter level in the air, measured in micrograms per cubic meter"                      
##  [3] "CANCER: Cancer risk due to toxics in the air"                                                                   
##  [4] "RESP: \"Ratio of exposure concentration to health-based reference concentration\""                              
##  [5] "PTRAF: Average number of daily vehicles at major roads divided by distance in meters"                           
##  [6] "PWDIS: Toxicity-weighted stream concentrations divided by distance in kilometers"                               
##  [7] "PNPL: Number of National Priorities List (NPL) sites within 5 km divided by distance in kilometers"             
##  [8] "PRMP: Number of Risk Management Plan (RMP) facilities within 5 km divided by distance in kilometers"            
##  [9] "PTSDF: Number of Treatment Storage and Disposal (TSDF) facilities within 5 km divided by distance in kilometers"
## [10] "OZONE: Summer daily average of ozone concentration in the air, in parts per billion"                            
## [11] "PM25: Yearly average PM2.5 level in the air, measured in micrograms per cubic meter"

Spatial Distributions

Proximity to treatment storage and disposal facilities (TSDFs)

pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$PTSDF)

leaflet(eastshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = eastshapes,
              fillColor = ~pal(PTSDF),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
                             "Proximity to TSDF: ", eastshapes$T_PTSDF)) %>%
  addLegend("bottomright", pal = pal, values = eastshapes$PTSDF,
            title = "Proximity to TSDF", opacity = 0.7)

Proximity to traffic

pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$PTRAF)

leaflet(eastshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = eastshapes,
              fillColor = ~pal(PTRAF),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
                             "Proximity to traffic: ", eastshapes$T_PTRAF)) %>%
  addLegend("bottomright", pal = pal, values = eastshapes$PTRAF,
            title = "Traffic Proximity", opacity = 0.7)

Distribution of PM2.5

pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$PM25)

leaflet(eastshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = eastshapes,
              fillColor = ~pal(PM25),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
                             "PM2.5 Level: ", eastshapes$T_PM25)) %>%
  addLegend("bottomright", pal = pal, values = eastshapes$PM25,
            title = "PM2.5 Concentrations", opacity = 0.7)

Air toxics cancer risk

pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$CANCER)

leaflet(eastshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = eastshapes,
              fillColor = ~pal(CANCER),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
                             "Cancer Risk: ", eastshapes$T_CANCR)) %>%
  addLegend("bottomright", pal = pal, values = eastshapes$CANCER,
            title = "Air Toxics Cancer Risk", opacity = 0.7)

Diesel Particulate Matter Level

pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$DSLPM)

leaflet(eastshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = eastshapes,
              fillColor = ~pal(DSLPM),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
                             "DSLPM: ", eastshapes$T_DSLPM)) %>%
  addLegend("bottomright", pal = pal, values = eastshapes$DSLPM,
            title = "Diesel Particulate Matter Level", opacity = 0.7)

Ozone Levels

pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$OZONE)

leaflet(eastshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = eastshapes,
              fillColor = ~pal(OZONE),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
                             "Ozone Level: ", eastshapes$T_OZONE)) %>%
  addLegend("bottomright", pal = pal, values = eastshapes$OZONE,
            title = "Ozone Levels in the Air", opacity = 0.7)

Scatterplots

These scatterplots show the relationship between pairs of EJSCREEN measures.

Ozone vs. PM2.5

ejscreen %>%
  ggplot() +
  geom_point(aes(x=OZONE, y=PM25, color=countyfips)) +
  labs(x="Ozone level",
       y="PM2.5 level") +
  scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))

Proximity to traffic vs. air toxics cancer risk

ejscreen %>%
  ggplot() +
  geom_point(aes(x=PTRAF, y=CANCER, color=countyfips)) +
  labs(x="Proximity to traffic",
       y="Cancer risk") +
  scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))

Proximity to traffic vs. diesel particulate matter level

ejscreen %>%
  ggplot() +
  geom_point(aes(x=PTRAF, y=DSLPM, color=countyfips)) +
  labs(x="Proximity to traffic",
       y="Diesel particulate matter level") +
  scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))

PM2.5 vs. diesel particulate matter level

ejscreen %>%
  ggplot() +
  geom_point(aes(x=PM25, y=DSLPM, color=countyfips)) +
  labs(x="PM2.5 level",
       y="Diesel particulate matter level") +
  scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))

Important Notes

PM2.5, ozone, and NATA indicators (cancer risk, respiratory hazard index, and diesel particulate matter) are measured at the census tract level, and the same value is assigned to each block group within that tract. All other variables were deriived for the block group level.